package com.zrrd.learn.chapter06;

import java.util.Arrays;

/**
 * 动态数组
 *
 * @author asus
 * @version 1.0
 * @date 2023/7/13 8:45
 */
/**
 * 定长数组 ： 长度固定的
 * 1 ： {1,1,1,1,2,3,4,5,56,12,12,3,3,3,5,56,56,67,67,7,4,23,45,67,7,78}
 * 1.1 求这个数组里面所有2的倍数  int[]
 * <p>
 * 动态数组 : 可变长数组 , 数组
 * <p>
 * 封装成一个类  DynamicArray
 * <p>
 * 底层  : 数组
 * 初始长度  10
 * 扩容  1.5 * len
 * 最大长度
 * <p>
 * 面向对象 ： 50%  结果
 * <p>
 * 函数式 ：  50%   function abc(){}
 * <p>
 * 面向过程 : 100%  细节
 * <p>
 * <p>
 * <p>
 * 数据结构 ：线性存储结构 [数组 | 动态数组{自写}]
 *
 * @author kangjx
 * @version 1.0
 * @date 2023/7/13 上午8:15
 */
public class DynamicArray {

    /**
     * 成员变量
     */
    int init_capacity = 10;
    int max_capacity = Integer.MAX_VALUE;

    int[] bottom_array;

    /**
     * 索引 ： 用来存储数组元素时的下标
     */
    int index = 0;

    /**
     * 成员方法
     * 构造方法  ： 与类名相同的方法 ,不能有返回値,什么时候执行 当有人new时
     */
    public DynamicArray() {
        bottom_array = new int[init_capacity];
    }

    /**
     * 用来完成把obj放到数组bottom_array里面的操作
     *
     * @param obj 使用者给我的数据
     * @return
     */
    public boolean add(int obj) {
        computeNewLength();
        bottom_array[index++] = obj;
        return true;
    }

    /**
     * 计算底层数组最后的扩展长度
     * 10 - 15
     */
    public void computeNewLength() {

        long newCapacity = bottom_array.length + (bottom_array.length >> 1);
        int lastCapacity = newCapacity > max_capacity ? max_capacity : (int) newCapacity;

        if (index == bottom_array.length) {
            bottom_array = Arrays.copyOf(bottom_array, lastCapacity);
        }
    }


    /**
     * 表示当前动态数组里面有多少个整数
     *
     * @return
     */
    public int size() {
        return index;
    }

    /**
     * 通过下标来获取元素内容
     * @param index  下标
     * @return
     */
    public int get(int index){
        return bottom_array[index];
    }

    public static void main(String[] args) {

        int[] as = {1, 1, 1, 1, 2, 3, 4, 5, 56, 12, 12, 3, 3, 3, 5, 56, 56, 67, 67, 7, 4, 23, 45, 67, 7, 78};
        DynamicArray d = new DynamicArray();
        for (int i = 0; i < as.length; i++) {
            if (as[i] % 2 == 0) {
                d.add(as[i]) ;
            }
        }

        System.out.println(d.get(d.index));


        System.out.println(d.size());
        //引用类型
//        DynamicArray d = new DynamicArray();
//        System.out.println(d.size());
//
//        for (int i = 0; i < 100; i++) {
//            d.add(i + 1);
//        }
//
//        System.out.println(d.size());
    }

}
